/**
 * 组合继承
 * 缺点：1.父类的构造函数会被调用两次
 *      2.无法继承父类的静态方法
 */

// function Person(name) {
//   this.name = name
// }
// //静态方法
// Person.watch = function(){}
// Person.prototype.say = function (){
//   console.log(this.name + 'say')
// }
//
// function Student(name,grade) {
//   Person.call(this,name)
//   this.grade = grade
// }
//Student.prototype = new Person() 组合继承
// Student.prototype = Object.create(Person.prototype) 寄生组合继承
// Student.prototype.constructor = Student
//
// Student.prototype.study = function (){
//   console.log(this.name + 'study')
// }
//
// const p = new Person('张三')
//
// p.say()
//
// const s1 = new Student('李四',2)
// s1.say()
// s1.study()

// function createObject(proto) {
//   function F() {
//   }
//   F.prototype = proto
//   return new F()
// }

// class Animal {
//   constructor(name,age) {
//     this.name = name
//     this.age = age
//   }
//
//   eat(){
//     console.log('eat')
//   }
//
//   static sleep(){
//     console.log('animal sleep')
//   }
// }
//
// class Dog extends Animal{
//   constructor(name,age) {
//     super(name,age);
//   }
//
//   bark(){
//     super.eat()
//     console.log('bark')
//   }
//
//   eat(){
//     super.eat() //重写父类实例方法，调用父类实例eat方法
//   }
//
//   static sleep(){
//     super.sleep() // 重写父类静态方法，调用父类静态sleep方法
//     console.log('dog sleep')
//   }
// }
//
// const d = new Dog('dog',1)
// d.bark()
// d.eat()
// Dog.sleep()